/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.user.dbaccess;

import java.math.BigInteger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;
import stud.cp.core.dbaccess.DAO;
import stud.cp.core.dbaccess.DAOException;
import stud.cp.user.valueobjects.PropertyType;

/**
 * Класс, отвечающий за
 * доступ к таблице property_type.
 * @author Morfant
 */
public class PropertyTypesDAO implements DAO<PropertyType> {

    /**
     * Логгер.
     */
    private static Logger logger = Logger.getLogger("CPTNP");
    /**
     * Список названий колонок таблицы weapon_types.
     */
    private static String[] propetyTypesColumnName = {"property_type_id", "name"};
    /**
     * Коннект к базе данных.
     */
    private Connection connection = null;

    /**
     * Конструктор.
     * @param connection Подключение к базе.
     */
    public PropertyTypesDAO(Connection connection) {
        this.connection = connection;
    }

    /**
     * Запрос, позволяющий получить запись по id.
     * @param id ID
     * @return Запрос.
     */
    private String getQueryForGetById(BigInteger id) {
        StringBuilder query = new StringBuilder();
        query.append("SELECT property_type_id,name \n");
        query.append("FROM property_types \n");
        query.append("WHERE property_type_id=");
        query.append(id);
        return query.toString();
    }

    /**
     * Метод, повзоляющий получить данные по ID
     * @param id ID
     * @return Запись.
     * @throws DAOException Ошибка получени данных по ID
     */
    @Override
    public PropertyType getById(BigInteger id) throws DAOException {
        PropertyType property = null;
        ResultSet set = null;
        PreparedStatement prestat = null;
        try {
            prestat = connection.prepareStatement(getQueryForGetById(id));
            set = prestat.executeQuery();
            if (set.next()) {
                property = new PropertyType(set.getBigDecimal(propetyTypesColumnName[0]).toBigInteger(),
                        set.getString(propetyTypesColumnName[1]));
            }
        } catch (SQLException ex) {
            logger.debug("DAO_propety_type", ex);
            throw new DAOException("Ошибка получения данных по ID.", ex);
        } finally {
            if (prestat != null) {
                try {
                    prestat.close();
                } catch (SQLException ex) {
                    logger.debug("DAO_propety", ex);
                    throw new DAOException("Ошибка закрытия ResultSet`а.", ex);
                }
            }
        }
        return property;
    }

    /**
     * Запрос, позволяющий при выполнении
     * получить полностью данные из таблицы
     * @return Строка запроса.
     */
    private String getQueryForAllProperty() {
        StringBuilder query = new StringBuilder();
        query.append("select property_type_id,name \n");
        query.append("from property_types \n");
        query.append("order by property_type_id");
        return query.toString();
    }

    /**
     * Получение списка данных.
     * @return Списко данных.
     * @throws DAOException Ошибка при получение списка данных.
     */
    @Override
    public List<PropertyType> getAll() throws DAOException {
        List<PropertyType> data_list = new LinkedList<PropertyType>();
        ResultSet set = null;
        PreparedStatement prestat = null;
        try {
            prestat = connection.prepareStatement(getQueryForAllProperty());
            set = prestat.executeQuery();
            while (set.next()) {
                data_list.add(new PropertyType(set.getBigDecimal(propetyTypesColumnName[0]).toBigInteger(),
                        set.getString(propetyTypesColumnName[1])));
            }
        } catch (SQLException ex) {
            logger.debug("DAO_propety_type", ex);
            throw new DAOException("Ошибка получнеия списка данных.", ex);
        } finally {
            if (prestat != null) {
                try {
                    prestat.close();
                } catch (SQLException ex) {
                    logger.debug("DAO_propety", ex);
                    throw new DAOException("Ошибка закрытия ResultSet`а.", ex);
                }
            }
        }
        return data_list;
    }

    @Override
    public void update(PropertyType entry) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public BigInteger create(PropertyType entry) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void delete(BigInteger id) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
